\subsection{XML}\label{sec:xml}
In questa sezione verranno descritti i punti salienti nello sviluppo dei file XML del sito.
\subsubsection{Panoramica}
Il sito deve poter gestire e archiviare informazioni relative agli utenti registrati al sistema e ai loro algoritmi. Inoltre è permesso agli utenti amministratori di poter gestire la base informativa del sito, come i contenuti delle FAQ, delle pagine di help e delle news del sito. Inoltre per una gestione migliore della struttura del sito alcune informazioni riguardanti la struttura stessa del sito sono state raccolte in documenti XML. Pertanto la base XML del sito è individuata dai seguenti file:
\begin{itemize}
\item Algorithms.xml;
\item Errors.xml;
\item FAQ.xml;
\item Help.xml;
\item News.xml;
\item PageHeader.xml;
\item Users.xml.
\end{itemize}

Questi file sono situati all'interno della cartella ``xml'' all'interno della cartella radice.
Per ognuno di questi file è stato definito il relativo schema in XMLSchema. È stato scelto di usare XMLSchema rispetto a DTD in quanto abbiamo preferito avere una rappresentazione più fedele dei tipi di dati che DTD non permette, e per avere una base completamente XML. I file che definiscono gli schemi sono individuati dal nome \texttt{<NomeFileXML>Schema.xsd}, dove \texttt{<NomeFileXML>} sono i nomi dei documenti XML elencati precedentemente. Il modello adottato per la definizione degli schemi è ``Tende alla Veneziana'' per la sua flessibilità e per la facilità nella gestione dei namespace e chiarezza di lettura.\\
Principalmente la realizzazione dei file XML e dei relativi schemi è stata effettuata da Riccardo Tesselli, eccetto che per i file Errors.xml e PageHeader.xml e i relativi schemi, che sono stati realizzati da Christian Cardin.

\subsubsection{Algoritmi}\label{subsec:algoritmi}
Nel file Algorithms.xml sono contenuti le informazioni relative agli algoritmi inseriti dagli utenti. Il documento istanza contiene un tag che indica la data di ultima modifica. Gli algoritmi sono organizzati in categorie e sottocategorie. Di una categoria è richiesto il suo nome identificativo. Di una sottocategoria è richiesto il nome e una breve descrizione, una sottocategoria può essere vuota o contenere un numero arbitrario di algoritmi. Ogni algoritmo è contraddistinto da un id, intero positivo, da una sua descrizione, il codice sorgente (inserito all'interno di un blocco \texttt{CDATA}), l'autore, eventuali note dell'autore, data di inserimento, i commenti fatti da altri utenti su quel algoritmo e il suo voto.\\
Un commento per un algoritmo è caratterizzato dalla data e ora di inserimento, il contenuto del commento e dal mittente.\\
Un voto è caratterizzato da un valore compreso tra 0 e 5 e dal votante.
Il documento per essere valido deve soddisfare due vincoli quali l'unicità dell'attributo id di un algoritmo, e uno stesso votante non può votare più volte lo stesso algoritmo. Questi vincoli sono stati definiti usando tag \texttt{<xs:unique>}.

\subsubsection{Errori}\label{subsec:errori}
Nel file Errors.xml sono contenute le informazioni per la gestione degli errori che si possono verificare nel sito. In caso si verifichi un errore questo documento verrà interrogato da uno script perl per ritornare il corretto messaggio di errore. Il documento suddivide gli errori a seconda del loro ambito (chiamati "scope" e identificati da un nome univoco), per permettere una estensione più facile nel caso si abbia la necessità di inserire nuovi controlli. All'interno di ogni tag scope vanno inseriti i messaggi di errore relativi a tale ambito, e ad ogni messaggio è attribuito un numero che lo identifica all'interno del suo scope di appartenenza. In tal modo, si può sempre identificare un messaggio con la coppia (scope,number).

\subsubsection{FAQ}\label{subsec:faq}
Nel file FAQ.xml sono contenute le FAQ del sito, modificabili attraverso il sito dagli utenti amministratori. Le FAQ sono caratterizzate da un titolo, una descrizione, la data di aggiornamento e dall'elenco delle domande suddivise in coppie domanda-risposta, suddivise in categorie.

\subsubsection{Pagine di help}\label{subsec:help}
Nel file Help.xml sono archiviati le informazioni relative alle pagine di help del sito. Il documento è caratterizzato dalla data di modifica e dalle pagine di help suddivise in categorie. Ogni categoria è caratterizzata dal nome e dalle relative pagine di help. Una pagina di help è caratterizzata da un id intero positivo univoco, dal titolo e dal suo contenuto. Il contenuto di una pagina di help è testo mescolato eventualmente con immagini e nomi di sezioni. Per realizzare ciò è stato definito un tipo complesso con contenuto misto e il tag \texttt{<xs:choice>}.\\
Una immagine è caratterizzata dal percorso al file immagine, dalla sua descrizione e dagli attributi di larghezza e altezza.

\subsubsection{News}\label{subsec:news}
Nel file News.xml sono archiviate le news del sito, che possono essere aggiunte dagli utenti amministratori del sistema tramite il sito. Le news sono caratterizzate dall'attributo di lingua in cui sono scritte e dalla data di ultima modifica. Una singola news è caratterizzata dal titolo, ora e data di inserimento e dal contenuto della news.

\subsubsection{Gestione pagine web}\label{subsec:pageheader}
Nel file PageHeader.xml sono archiviate le informazioni relative alle pagine web che realizzano il sito e dalle informazioni comuni nelle pagine. Tale xml è strutturato in due parti principali. Inizialmente è presente il tag \texttt{<nav>} che descrive la struttura del menù del sito, seguito poi dal tag \texttt{<pages>} che contiene le informazioni delle singole pagine web.\\
\begin{itemize}
\item Il tag \texttt{<pages>} racchiude una serie di elementi \texttt{page}, i quali contengono tutte le informazioni che andranno indicate nell'header html di ogni pagina del sito. Una pagina è identificata univocamente dal suo nome, che corrisponde alla base del proprio indirizzo url (ad esempio index.cgi ha come nome univoco index); successivamente sono indicati il titolo della pagina, la descrizione, la lista di keywords e la lista dei css e javascript da includere. Abbiamo scelto questa soluzione per la semplicità di modifica delle pagine, in quanto si trovano tutte le informazioni in un solo file. In questo modo nella fase iniziale si può lavorare facilmente sulle keywords, nei title e nei description per ottimizzarli in vista di un buon posizionamento nei motori di ricerca.

Un'altra caratteristica è il tag \texttt{<precursorId>}, che funge da chiave esterna per indicare il cammino da compiere per arrivare a tale pagina partendo da una pagina radice. Una pagina è considerata radice se ha come precursore se stessa. Ciò è utile al fine di creare il breadcrumb. Al momento nel file è presente una sola pagina radice, la index, ma non è escluso che in futuro possano essercene altre. Sono stati definiti dei vincoli in modo che il precursore di una pagina esista sempre. 

\item Il tag \texttt{<nav>} contiene informazioni necessarie per la costruzione dinamica del menù e del breadcrumb presenti in ogni pagina. Al suo interno compare una sequenza di \texttt{<link>} e \texttt{<toplink>}. Un link rappresenta un normale link di primo livello a una pagina, mentre toplink rappresenta un link a una pagina che è alla base altri link di secondo livello, visualizzati con css tramite una tendina che compare al passaggio del mouse.

La struttura dello schema permette l'inserimento dei link di primo livello prima di tutti gli altri toplink. Questa è stata una scelta voluta per non mescolare link di primo livello con menù che si aprono a tendina, confondendo l'utente.
 
I link e i toplink sono identificati univocamente dall'anchor, che altro non è che la pagina a cui puntano. La cosa particolare da notare è il meccanismo di chiavi esterne creato con gli elementi \texttt{<page>}, in modo da assicurare che un link del menù di navigazione conduca sempre ad una pagina esistente. Al contrario, una pagina può esistere anche senza avere un link nel menù.
Sono presenti anche altre informazioni opzionali sull'accesskey e sul numero di tabindex.
\end{itemize}
\subsubsection{Utenti}\label{users}
Nel file Users.xml sono contenute le informazioni degli utenti registrati al sito. Il documento contiene le informazioni di ultima modifica e l'elenco dei singoli utenti. Un utente è caratterizzato da nome e cognome (facoltativi), username univoco, indirizzo email univoco, password (che verrà memorizzata criptata), paese, organizzazione e data di inserimento, inoltre sono memorizzati due attributi che indicano se un utente è utente amministratore e se è un utente iscritto alla mailing-list.\\
Per la definizione del tipo che rappresenta una email è stato ristretto il valore xs:string tramite un pattern che accetta tutte le stringhe che non iniziano con ``@'' 
, seguite da un numero arbitrario di caratteri seguiti da ``@'', seguita da una sequenza di caratteri che non inizi con ``.'', seguita da una sequenza di caratteri arbitrari.\\
È stato scelto di restringere anche il valore per i paesi, a scapito di uno schema più verboso abbiamo preferito avere dei dati consistenti.